/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import sv.com.compassion.entidades.Asociacion;
import sv.com.compassion.entidades.Cdi;
import sv.com.compassion.entidades.Municipio;
import sv.com.compassion.entidades.Nivelescolaridad;
import sv.com.compassion.entidades.Tipotutor;
import sv.com.compassion.entidades.Tutor;
import sv.com.compassion.util.Fecha;
import sv.com.compassion.util.JqGrid;
import sv.com.compassion.util.RowsGrid;

/** Clase para mantenimiento de Tutor . 
* @author grupo de Tesis
*/
public class TutorAction extends ComunAction {
    private GenericoDAO genericoDAO;
    private Tutor tutor;
    private String nomTutor;
    private String apeTutor;
    private String edaTutor;
    private String idTipoTutor;
    private String cdis;
    private String VERhis;
    private String formaBus;
    private String dui;
 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a la clase entidad Tutor. 
 */    
 
public TutorAction(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
        tutor = new    Tutor();
        
        tutor.setIdCdi(new Cdi());
        tutor.setIdTipoTutor(new Tipotutor());
        tutor.setIdNivEsc(new Nivelescolaridad());
}  
/**
 * Busca el método que se ejecutara
 */
    @Override
    public String execute(){
        buscarMetodo(tutor);        
        return null;
    }
 /**
 * @param objeto de la entidad Tutor
 * inserta tutores, haciendo uso de la entidad Tutor.
 */       
    @Override    
    public void agregarEntidad(Object o) {
        Tutor t;
        List<Asociacion> listaAsociacion = null;
        int idCdi = 0;
        String query = "";
        try{
            t = (Tutor)o;
            
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();

            query = "SELECT x FROM Asociacion x WHERE " +
                    "x.idEmpleado = '" + idUsuario + "'";
            
            listaAsociacion = genericoDAO.find(query,null,null);
            
            for(Asociacion as: listaAsociacion){
                    idCdi = as.getIdCdi().getIdCdi();
            }
            
            setIdCdi(idCdi);
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            setIdTipoTutor(t.getIdTipoTutor().getIdTipoTutor());
            t.setEdaTutor(edad(sdf.format(t.getFecNacimiento())));
            t.setAuAddUsr(Integer.parseInt(idUsuario));
            t.setAuAddDat(new Date());

            genericoDAO.save(t);
        }catch(Exception e){
            Logger.getLogger(TutorAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad Tutor
 * Modifica el registro que se recibe de parámetro a inactivo (-1)
 */     
        @Override
    public void borrarEntidad(Object o) {
        List<Tutor> listTutor;
        Tutor t;
        try{
            if(getId()!=null){
                listTutor = genericoDAO.find("SELECT t FROM Tutor t WHERE t.idTutor = " + getId(), null, null);
                if(!listTutor.isEmpty()){
                    t = listTutor.get(0);
                    t.setEstTutor(-1);
                    genericoDAO.update(t);
                }
            }            
        }catch(Exception e){
            Logger.getLogger(TutorAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
 /**
 * @param objeto de la entidad Tutor
 * Modifica el registro que se recibe de parámetro.
 */           
    @Override
    public void editarEntidad(Object o) {
        Tutor t;
        List<Asociacion> listaAsociacion = null;
        int idCdi = 0;
        String query = "";
        try{
            t = (Tutor)o;
            
            Map session = ActionContext.getContext().getSession();
            String idUsuario = session.get("idUsuario").toString();
            
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

            t.setEdaTutor(edad(sdf.format(t.getFecNacimiento())));
            
            t.setIdTutor(new Integer(getId()));
            setIdTipoTutor(t.getIdTipoTutor().getIdTipoTutor());
            
            query = "SELECT x FROM Asociacion x WHERE " +
                    "x.idEmpleado = '" + idUsuario + "'";
            
            listaAsociacion = genericoDAO.find(query,null,null);
            
            for(Asociacion as: listaAsociacion){
                    idCdi = as.getIdCdi().getIdCdi();
            }
            
            setIdCdi(idCdi);

            setAuModUsr(Integer.parseInt(idUsuario));
            setAuModDat(new Date());
            
            genericoDAO.update(t);
        }catch(Exception e){
            Logger.getLogger(TutorAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }
/**
 * Este método realiza las búsquedas de los tutores
 * espera los filtros opcionales:
 *       nomTutor,
 *       apeTutor,
 *       idTipoTutor, 
 *       edaTutor,
 *       cdis,
 *       VERhis,
 *       dui
 */        
    @Override
    public void alimentarGrid() {
        JqGrid jg = new JqGrid();
        int total = 0;
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
         
        List<Tutor> listaTutor = null;
        String query="";
        nomTutor = getRequest().getParameter("NomTutor");
        apeTutor = getRequest().getParameter("ApeTutor");
        idTipoTutor = getRequest().getParameter("IdTipo");
        edaTutor = getRequest().getParameter("EdaTutor");
        cdis = getRequest().getParameter("Cdis");
        VERhis = getRequest().getParameter("VERhis");
        formaBus = getRequest().getParameter("FormaBus");
        dui = getRequest().getParameter("dui");
       
        String duiTutorquery = "";
        String nomTutorquery = "";
        String apeTutorquery = "";
        String edaTutorquery = "";
        String queryIdTipoTutor = "";
        String queryCdi = "";
        String queryAux = "";
        if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
            queryAux = "t.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "') and ";
        }
        nomTutorquery = "t.nomTutor like upper('%" + nomTutor + "%') ";
        if(!apeTutor.equals("") || !edaTutor.equals("") || !idTipoTutor.equals("") || !cdis.equals("")||!dui.equals("")){
            if(!apeTutor.equals("")){
                apeTutorquery = "and t.apeTutor like upper('%" + apeTutor + "%') ";
            }
            
            if(!edaTutor.equals("")){
                    edaTutorquery = "and t.edaTutor  = '" + edaTutor + "' ";
            }
            if(!idTipoTutor.equals("")){
                queryIdTipoTutor = "and t.idTipoTutor  = '" + idTipoTutor + "' ";
            }
            if(!dui.equals("")){
                duiTutorquery = "and t.duiTutor like '%" + dui + "%' ";
            }            
            if(!cdis.equals("")){
                queryCdi = "and t.idCdi = '" + cdis + "' ";
            }
        }
        String verHistorial;
        String verHistorialTemp = "";
        if(VERhis.equals("true")){
            verHistorial = "-1";
            verHistorialTemp = "1";
        }else{
            verHistorial = "1";
            verHistorialTemp = "1";
        }
        try{
                if(getSearch()!= null && getSearch().equals("true")){
                    
                }else{
                    
                    query = "SELECT t FROM Tutor t WHERE " +
                                queryAux + 
                                nomTutorquery +
                                apeTutorquery +
                                edaTutorquery + 
                                queryIdTipoTutor +
                                queryCdi +
                                duiTutorquery +
                                "and (t.estTutor like upper('" + verHistorial + "') or "
                                + "t.estTutor like upper('" + verHistorialTemp + "'))"
                                + " ORDER BY t.nomTutor " + getSord();
                }
                if(formaBus.equals("1")){ 
                }else{   
                    listaTutor = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                    query = "SELECT COUNT(t) FROM Tutor t WHERE " +
                                queryAux + 
                                nomTutorquery +
                                apeTutorquery +
                                edaTutorquery + 
                                queryIdTipoTutor +
                                queryCdi +
                                duiTutorquery +
                                "and (t.estTutor like upper('" + verHistorial + "') or "
                                + "t.estTutor like upper('" + verHistorialTemp + "'))";
                    total = genericoDAO.countRow(query);
                    //configuraciones basicas
                    jg.setPage(getPage());
                    jg.setRecords(total);
                    jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                    jg.setSord(getSord());
                    jg.setSidx(getSidx());
                    List<RowsGrid> rows = new ArrayList<RowsGrid>();

                    for(Tutor t: listaTutor){
                        RowsGrid r = new RowsGrid(); 
                        r.setId(t.getIdTutor().toString());
                        List cell = new ArrayList();

                        cell.add(t.getNomTutor());
                        cell.add(t.getApeTutor());

                        if(t.getEstTutor() == 1){
                            cell.add("Activo");
                        }else{
                            cell.add("Inactivo");
                        }

                        cell.add(t.getEdaTutor());
                        cell.add(t.getDirTutor());
                        if(t.getSexTutor() == 'M'){
                            cell.add("Masculino");
                        }else{
                            cell.add("Femenino");
                        }  

                        cell.add(t.getDuiTutor());
                        cell.add(t.getTelTutor());
                        cell.add(t.getCelTutor());

                        cell.add(t.getFecNacimiento().toString());

                        cell.add(t.getIdTipoTutor().getIdTipoTutor());
                        cell.add(t.getIdNivEsc().getIdNivelEscolaridad());
                        cell.add(t.getIdNivEsc().getNomNivelEscolaridad());
                        cell.add(t.getIdTipoTutor().getNomTipoTutor());

                        cell.add(t.getAuAddUsr());
                        cell.add(t.getAuAddDat().toString());

                        r.setCell(cell);
                        rows.add(r);
                    }

                    jg.setRows(rows);
                    JSONObject jo = JSONObject.fromObject(jg);
                    enviarJsonNavegador(getResponse(), jo);
                }
        }catch(Exception e){
            Logger.getLogger(TutorAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }

    public Integer getIdTutor() {
        return tutor.getIdTutor();
    }

    public void setIdTutor(Integer idTutor) {
        tutor.setIdTutor(idTutor);
    }

    public String getNomTutor() {
        return tutor.getNomTutor();
    }

    public void setNomTutor(String nomTutor) {
        tutor.setNomTutor(nomTutor);
    }

    public String getApeTutor() {
        return tutor.getApeTutor();
    }

    public void setApeTutor(String apeTutor) {
        tutor.setApeTutor(apeTutor);
    }

    public Integer getEdaTutor() {
        return tutor.getEdaTutor();
    }

    public void setEdaTutor(Integer edaTutor) {
        tutor.setEdaTutor(edaTutor);
    }

    public String getDirTutor() {
        return tutor.getDirTutor();
    }

    public void setDirTutor(String dirTutor) {
        tutor.setDirTutor(dirTutor);
    }

    public Character getSexTutor() {
        return tutor.getSexTutor();
    }

    public void setSexTutor(Character sexTutor) {
        tutor.setSexTutor(sexTutor);
    }

    public String getDuiTutor() {
        return tutor.getDuiTutor();
    }

    public void setDuiTutor(String duiTutor) {
       tutor.setDuiTutor(duiTutor);
    }

    public String getTelTutor() {
        return tutor.getTelTutor();
    }

    public void setTelTutor(String telTutor) {
        tutor.setTelTutor(telTutor);
    }

    public String getCelTutor() {
        return tutor.getCelTutor();
    }

    public void setCelTutor(String celTutor) {
        tutor.setCelTutor(celTutor);
    }

    public int getEstTutor() {
        return tutor.getEstTutor();
    }

    public void setEstTutor(int estTutor) {
        tutor.setEstTutor(estTutor);
    }

    public String getFecNacimiento() {
        return Fecha.date2String(tutor.getFecNacimiento());
    }

    public void setFecNacimiento(String fecNacimiento) {
        try {
            tutor.setFecNacimiento(Fecha.string2Date(fecNacimiento));
        } catch (ParseException ex) {
            Logger.getLogger(TutorAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getAuAddUsr() {
        return tutor.getAuAddUsr();
    }

    public void setAuAddUsr(int auAddUsr) {
        tutor.setAuAddUsr(auAddUsr);
    }

    public String getAuAddDat() {
        return Fecha.date2String(tutor.getAuAddDat());
    }

    public void setAuAddDat(String auAddDat) {
        try {
            if(auAddDat!=null && !auAddDat.equals("")){
                tutor.setAuAddDat(Fecha.string2Date(auAddDat));
            }    
        } catch (ParseException ex) {
            Logger.getLogger(TutorAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getAuModUsr() {
        return tutor.getAuModUsr();
    }

    public void setAuModUsr(int auModUsr) {
        tutor.setAuModUsr(auModUsr);
    }

    public Date getAuModDat() {
        return tutor.getAuModDat();
    }

    public void setAuModDat(Date auModDat) {
        tutor.setAuModDat(auModDat);
    }

    public Integer getIdTipoTutor() {
        return tutor.getIdTipoTutor().getIdTipoTutor();
    }

    public void setIdTipoTutor(Integer idTipoTutor) {
        tutor.getIdTipoTutor().setIdTipoTutor(idTipoTutor);
    }
    public Integer getIdNivEsc() {
        return tutor.getIdNivEsc().getIdNivelEscolaridad();
    }

    public void setIdNivEsc(Integer idNivEsc) {
        tutor.getIdNivEsc().setIdNivelEscolaridad(idNivEsc);
    }
    public Integer getIdCdi() {
        return tutor.getIdCdi().getIdCdi();
    }

    public void setIdCdi(Integer idCdi) {
        tutor.getIdCdi().setIdCdi(idCdi);
    }
/**
 * Para ejecutar reporte tutores, esté
 * espera los filtros opcionales:
 *       nomTutor,
 *       apeTutor,
 *       idTipoTutor, 
 *       edaTutor,
 *       cdis,
 *       VERhis,
 *       dui
 */   
    @Override
    public void reporteXls() {
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
        
        String query="";
        nomTutor = getRequest().getParameter("NomTutor");
        apeTutor = getRequest().getParameter("ApeTutor");
        idTipoTutor = getRequest().getParameter("IdTipo");
        edaTutor = getRequest().getParameter("EdaTutor");
        cdis = getRequest().getParameter("Cdis");
        VERhis = getRequest().getParameter("VERhis");
        formaBus = getRequest().getParameter("FormaBus");
        dui = getRequest().getParameter("dui");
        
        String duiTutorquery = "";
        String nomTutorquery = "";
        String apeTutorquery = "";
        String edaTutorquery = "";
        String queryIdTipoTutor = "";
        String queryCdi = "";
        String queryAux = "";
        if(idCargo.equals("6") || idCargo.equals("7") || idCargo.equals("8") || idCargo.equals("9")){
            queryAux = "t.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "') and ";
        }
        nomTutorquery = "t.nomTutor like upper('%" + nomTutor + "%') ";
        if(!apeTutor.equals("") || !edaTutor.equals("") || !idTipoTutor.equals("") || !cdis.equals("")||!dui.equals("")){
            if(!apeTutor.equals("")){
                apeTutorquery = "and t.apeTutor like upper('%" + apeTutor + "%') ";
            }
            
            if(!edaTutor.equals("")){
                    edaTutorquery = "and t.edaTutor  = '" + edaTutor + "' ";
            }
            if(!idTipoTutor.equals("")){
                queryIdTipoTutor = "and t.idTipoTutor  = '" + idTipoTutor + "' ";
            }
            if(!dui.equals("")){
                duiTutorquery = "and t.duiTutor like '%" + dui + "%' ";
            }              
            if(!cdis.equals("")){
                queryCdi = "and t.idCdi = '" + cdis + "' ";
            }
        }
        String verHistorial;
        String verHistorialTemp = "";
        if(VERhis.equals("true")){
            verHistorial = "-1";
            verHistorialTemp = "1";
        }else{
            verHistorial = "1";
            verHistorialTemp = "1";
        }
        
        query = "SELECT t FROM Tutor t WHERE " +
                                queryAux + 
                                nomTutorquery +
                                apeTutorquery +
                                edaTutorquery + 
                                queryIdTipoTutor +
                                queryCdi +
                                duiTutorquery +
                                "and (t.estTutor like upper('" + verHistorial + "') or "
                                + "t.estTutor like upper('" + verHistorialTemp + "'))"
                                + " ORDER BY t.nomTutor desc";
        
        HSSFWorkbook libro  = null;
        OutputStream out    = null;
        HttpServletResponse response = ServletActionContext.getResponse();
        
        try{
                out = response.getOutputStream();            

                // capturamos la direccion absoluta de la plantilla del reporte en el servidor 
            //    String path = getServlet().getServletContext().getRealPath("/xlt/reporteConsolidadoSMS.xlt");
                
                String ruta = ServletActionContext.getRequest().getSession().getServletContext().getRealPath("/reports/reportTutor.xlt");
                FileInputStream stream = new FileInputStream(ruta); // obtenemos al archivo
                libro = new HSSFWorkbook(stream);      // el libro de trabajo

                response.setHeader("Pragma", "cache");          // Para mostrar ventana de apertura del archivo
                response.setContentType("application/ms-excel");
                response.setHeader("Content-Disposition","attachment;filename=reportTutor.xls");
        
                libro = generarExcel(libro,query); 

                libro.write(out);
                out.flush();
                out.close();
        }catch(Exception e){
          e.printStackTrace();
        }         
    }
  private HSSFWorkbook generarExcel(HSSFWorkbook book, String queryExt) {
          /**
     * EL ESTILO DEL REPORTE
     */
      HSSFCellStyle styleBordere = book.createCellStyle();
      HSSFFont fontReport = book.createFont();
      fontReport.setFontName("Arial");
      fontReport.setFontHeightInPoints((short)10);
      styleBordere.setFont(fontReport);
      styleBordere.setBorderBottom(styleBordere.BORDER_THIN);
      styleBordere.setBorderLeft(styleBordere.BORDER_THIN);
      styleBordere.setBorderRight(styleBordere.BORDER_THIN);
      styleBordere.setBorderTop(styleBordere.BORDER_THIN);
      styleBordere.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      
      List<Tutor> listaTutor = null;
      
      HSSFSheet sheet = book.getSheet("Hoja1"); //nombre de la hoja 
      HSSFRow row = sheet.getRow(1);
      HSSFCell celda = null;
      Date      today    =   new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    //  String    ahora   =   ;
      row = sheet.createRow(3);
      celda = row.createCell(6);
      celda.setCellValue(new HSSFRichTextString(String.valueOf(sdf.format(today))));
      celda.setCellStyle(styleBordere);
      int col = 1;
      int fila  = 10;
      String query = queryExt;
                    
                    /*if(getNomTutor() !=null){
                        query += " upper(t.nomTutor) like upper('%"+ getNomTutor() +"%') and  ";
                    }
                    if(getApeTutor()!=null){
                        query += " upper(t.apeTutor) like upper('%"+getApeTutor()+"%') and  ";
                    }
                    if(getEdaTutor()!=null){
                        query += " t.edaTutor like '%"+getEdaTutor()+"%' and  ";
                    }
                    query = query.substring(0, query.length()-5)+" order by t.nomTutor ";*/
      listaTutor = genericoDAO.find(query,null,null);
     // listaCdi = genericoDAO.find(query,null,null);

      for(Tutor t: listaTutor){

            col = 1;
            row = sheet.createRow(fila);
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(t.getNomTutor() + " " + t.getApeTutor())));
            celda.setCellStyle(styleBordere);
                       
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(t.getEdaTutor())));
            celda.setCellStyle(styleBordere);
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(t.getDuiTutor())));
            celda.setCellStyle(styleBordere);                

            String genero = "";
             if(t.getSexTutor() == 'M'){
                genero = "Masculino";
             }else{
                genero = "Femenino";
             }  
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(genero));
            celda.setCellStyle(styleBordere);      
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(t.getIdTipoTutor().getNomTipoTutor())));
            celda.setCellStyle(styleBordere);  
            
            celda = row.createCell(col++);
            celda.setCellValue(new HSSFRichTextString(String.valueOf(t.getIdCdi().getNomCdi())));
            celda.setCellStyle(styleBordere); 
            
            fila ++;
      }      
      return book;  
    }
   public int edad(String fecha_nac) {     //fecha_nac debe tener el formato dd/MM/yyyy
   
    Date fechaActual = new Date();
    SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
    String hoy = formato.format(fechaActual);
    String[] dat1 = fecha_nac.split("/");
    String[] dat2 = hoy.split("/");
    int anos = Integer.parseInt(dat2[2]) - Integer.parseInt(dat1[2]);
    int mes = Integer.parseInt(dat2[1]) - Integer.parseInt(dat1[1]);
    if (mes < 0) {
      anos = anos - 1;
    } else if (mes == 0) {
      int dia = Integer.parseInt(dat2[0]) - Integer.parseInt(dat1[0]);
      if (dia < 0) {
        anos = anos - 1;
      }
    }
    return anos;
  }    
            
}
